#include <stdio.h>
#include <stdlib.h>
#include "pixel_processing.h"

#include <stdbool.h>

/**
 * @brief 真正的RGB888像素和输出的RGB888误差是否小于2%
 * @param std_888 
 * @param out_888 
 * @return true 是
 * @return false 否
 * @note 测试用
 */
bool error_analyze(void* std_888, void* out_888)
{
    uint8_t* std = (uint8_t*)std_888;
    uint8_t* out = (uint8_t*)out_888;
    float r1 = (float)std[0], g1 = (float)std[1], b1 = (float)std[2];
    float r2 = (float)out[0], g2 = (float)out[1], b2 = (float)out[2];
    if ((r1 - r2) / 255 < 0.02 && (g1 - g2) / 255 < 0.02 && (b1 - b2) / 255 < 0.02)//除数不能为0！
    {
        return true;
    }
    else
    {
        return false;
    }
}

void test1(void)
{
    uint16_t test_data_565[] = {
    0xF800, // 红色
    0x07E0, // 绿色
    0x001F, // 蓝色
    0xFFFF, // 白色
    0x0000, // 黑色
    0x8010, // 紫色（近似）
    0xFD20, // 橙色（近似）
    0XFFD9,//柠檬绸色
    0XFF36//桃色
    };
    size_t count = sizeof(test_data_565) / sizeof(uint16_t);
    uint8_t* output_888 = (uint8_t*)malloc(3 * count); // 为RGB888数据预留空间

    // 使用数组转换函数
    rgb565_to_rgb888_array(test_data_565, output_888, count);

    // 验证输出
    uint8_t std_888[] = {
    0xFF, 0x00, 0x00, // 红色
    0x00, 0xFF, 0x00, // 绿色
    0x00, 0x00, 0xFF, // 蓝色
    0xFF, 0xFF, 0xFF, // 白色
    0x00, 0x00, 0x00, // 黑色
    0x80, 0x00, 0x80, // 紫色（近似 R=128, G=0, B=128）
    0xFF, 0xA5, 0x00,  // 橙色（近似 R=255, G=165, B=0）
    0xFF, 0xFA, 0xCD, //柠檬绸色
    0xFF,0xE5,0xB4//桃色
    };
    
    bool flag = true;
    uint8_t* po = output_888;
    uint8_t* ps = std_888;
    while (po <= output_888 + 3 * (count - 1))
    {
        if (!error_analyze(po, ps))
        {
            flag = false;
            break;
        }
        po += 3;
        ps += 3;
    }
    if (flag) {
        printf("测试通过！\n");
    }
    else {
        printf("测试失败！\n");
    }
}
int main(void)
{
    test1();
	return 0;
}